
var formula={};
// 用于表示的公式字符串
formula.showStr = new Array();
// 用于发送到后台去的字符串
formula.sendStr = new Array();
// 记录上一个点击区域是那个，概算标准为A区,系统函数为B区,键盘区为C区
formula.handle = '';
// 设置上一次的B区正在操作的函数
formula.fun = '';
// 上一次是否操作成功 , 默认上一次操作都是成功的
formula.lastOpt = true; 
// 此方法的操作区为A区
function standardTrDbclick( _tr ){
	// 确定按钮可用
	btnEnable();
	var code = $( _tr ).attr('code');
	var name = $( _tr ).attr('name');
	// 如果当前区域是B区，就提示请求去输入一个数据或符号
	if( formula.handle == 'B' ){
		window.alert( '语法错误,请重新编辑公式!' );
		return;
	}
	// 如果是当前区为A区，就弹出上一个元素，再压入新元素 
	if( formula.handle == 'A'){
		// 如果上一次压栈没有成功那就不进行弹栈操作
		if( formula.showStr.indexOf( name ) != -1 ){
			window.alert( "此项已存在" );
			return;
		}
		if( formula.lastOpt ){
  			formula.showStr.pop( );
  			formula.sendStr.pop( );
		}
		// 添加展示用的数组
		formula.lastOpt = formula.showStr.append( name );
		formula.sendStr.append( name+'@@'+code+'##1'  );
	// 如果当前区不是A区，就直接压入一个元素
	}else{
		formula.lastOpt = formula.showStr.append( name );
		formula.sendStr.append( name+'@@'+code+'##1' );
	}
	if( !formula.lastOpt ){
		window.alert( "此项已存在" );
		// return;
	}
	// 设置当前区
	formula.handle = 'A';
	// 书写元素
	writeFormula();
}
// 此方法的操作区为B区
function trDbclick( _tr ){
	// 确定按钮可用
	btnEnable();
	var code = $( _tr ).attr('code');
	var name = $( _tr ).attr('name');
	// 如果当前区A区，就提示请求去输入一个数据或符号
	if( formula.handle == 'A' ){
		window.alert( 'A语法错误,请重新编辑公式!' );
		return;
	}
	if( formula.handle == 'B' && formula.fun != $('#formulaUncertainFun').val() ){
		window.alert( 'B语法错误,请重新编辑公式!' );
		// 设置当前区
  		formula.handle = 'B';
  		// 设置当前B区正在操作的函数
  		formula.fun = $('#formulaUncertainFun').val();
		return;
	}
	// 如果当前区为B区，就弹出上一个元素，再压入新元素
	if( formula.handle == 'B' && formula.fun == $('#formulaUncertainFun').val()){
		// 如果上一次压栈没有成功 而且数组中已没有此项 那就不进行弹栈操作
		if( formula.showStr.indexOf( $('#formulaUncertainFun').val()+'(' + name + ')' ) != -1 ){
			window.alert( "此项已存在" );
			return;
		}
		if( formula.lastOpt /*&& formula.showStr.indexOf( $('#formulaUncertainFun').val()+'(' + name + ')' ) == -1*/ ){
  			formula.showStr.pop( );
  			formula.sendStr.pop( );
		}
		formula.lastOpt = formula.showStr.append( $('#formulaUncertainFun').val()+'(' + name + ')' );
		formula.sendStr.append( $('#formulaUncertainFun').val()+'(' + name + '@@' + code + ')##6'  );
	}else{
  		formula.lastOpt = formula.showStr.append( $('#formulaUncertainFun').val()+'(' + name + ')' );
  		formula.sendStr.append( $('#formulaUncertainFun').val()+'(' + name + '@@' + code + ')##6'  );
	}
	if( !formula.lastOpt ){
		window.alert( "此项已存在" );
	}
	// 设置当前区
	formula.handle = 'B';
	// 设置当前B区正在操作的函数
	formula.fun = $('#formulaUncertainFun').val();
	writeFormula();
}
// 对于C区的操作没有逗号间隔，所有添加一个数组来记录C区的操作，最后以join('')的方法添加到总数组
// formula.strC = new Array();
// 对编辑公式的键盘进行事件绑定
// 此方法的操作区为C区
$( '.key' ).bind( 'click' , function(){
	// 确定按钮可用
	btnEnable();
	// 如果上一个操作区还是C区，那么取出弹出最后的一个元素，合并到当前元素再压到数组中
	if( formula.handle == 'C' ){
		// 弹出最近元素
		var elem = formula.showStr.pop();
		var realElem = formula.sendStr.pop( );
		formula.lastOpt = formula.showStr.append( elem + $( this ).val() );
		formula.sendStr.append( realElem + $( this ).attr('desc') );
	}else{
  		// 此方法不进行同区单选判断
  		formula.lastOpt = formula.showStr.append( $( this ).val() );
  		formula.sendStr.append( $( this ).attr('desc') );
	}
	if( !formula.lastOpt ){
		window.alert( "此项已存在" );
	}
	// window.alert( formula.sendStr + "\n" + formula.showStr );
	// 设置当前区
	formula.handle = 'C';
	writeFormula();
} );
// 写公式
function writeFormula(){
	$( '#formulaUncertainTxtId' ).text( formula.showStr.join( ' ' ) );
	$( '#formulaUncertainTxtHidden' ).text( formula.sendStr.join( ',' ) );
}
// 清除内容
function clearFormula(){
	formula.showStr = new Array();
	formula.sendStr = new Array();
	formula.handle = '';
	formula.fun = '';
	formula.lastOpt = true;
	writeFormula();
	btnEnable();
}

function btnEnable(){
	$( '#_sendFormula' ).attr( 'disabled' , '' );
	$( '#_sendFormula' ).removeClass( 'btn_disable' );
}


// 当系统函数的select被调用onchange事件时，所发生的事件，
// 参数sele 是指调用onchange事件的本身
function selectFunction( sele ){
	var val = $( sele ).val();
	// 以此val做为div的id去取出div，并判断div的isLazy属性是否为1，如果为1就再去后台请求参数数据
	var _div = $( '#'+val );
	// 如果此下拉框的选择项没有定义isLazy属性就什么也不做
	if( typeof( $( _div ).attr( 'isLazy' ) ) == 'undefined' ){
		return;
	}else{
		// 判断如果选择项定义了isLazy属性，那就判断此属性的值，如果为0就只是把此div的内容移到正确的位置显示，如果为1就去后台访问数据
		if( $( _div ).attr( 'isLazy' ) == '0' ){
			// 判断是否有参数
			var __tbody = $( '#tbody_'+val )[0];
			if( _getChilds( __tbody ).length == 0 ){
				$( '#tbody_'+val ).append( "<tr ondblclick=\"trDbclick(this);\" code=\"\" name=\"\"><td>"+ val +"</td></tr>" );
			}
			var htm = $( _div ).html();
			// 把内容添加到正确的位置
			$( '#systemFunction' ).html( htm );
		}else{
			// 去后台请求数据 , 此处的查询就是以计价规则的id查出此计价规则下的所有科目列表，并在页面以树形展示
			var _url = 'priceSubjectListAction!listPriceSubjectByPriceRuleId.action?priceRuleForm.id='+$( '#formulaUncertainPriceRuleId' ).val();
			$.ajax( {
				url : _url,
				type : 'GET',
				success : function( result ){
					// 请求如果成功了，就返回一个json的字符串，把此串变成科目表
					var subjectMsg = new JsonMsgObj( result );
					// 不用再判断成功与否了，此处一定成功的,直接把信息取出来变为js数组对象
					var msg = subjectMsg.getMessage();
					var subs = window.eval( '('+ msg +')' );
					// 此处的subs是一个js的数组，数组中的每一个元素都是一个js对象 , 在此处只取出其中的name与id
					// 新建新建立出一个tbody对象，然后把新建的tr逐个添加到tbody中
					var tbody = document.createElement('tbody');
					$( tbody ).addClass( 'mytbody' );
					// 删除已有tbody
					$( '#tbody_'+val ).remove();
					// 添加新建的tbody的id
					$( tbody ).attr( 'id' , 'tbody_'+val );
					var trArray = new Array();
					for( var i=0;i<subs.length;i++ ){
						// 并判断是第几层的操作
						if( new Number( subs[i].level ) == 0 ){
							trArray.push( '<tr ondblclick="trDbclick(this);" code="'+ subs[i].id +'" name="'+ subs[i].name +'"><td><input type="hidden" value="'+ subs[i].id +'"/><div class="pricerule_subject_table_tr_parent">'+subs[i].name+'</div></td></tr>' );
						}else{
							trArray.push( '<tr ondblclick="trDbclick(this);" code="'+ subs[i].id +'" name="'+ subs[i].name +'"><td><input type="hidden" value="'+ subs[i].id +'"/><div class="pricerule_subject_table_tr_last_child" style="margin-left: '+ ( new Number( subs[i].level ) * 12 ) +'px; ">'+subs[i].name+'</div></td></tr>' );
						}
					}
					// 把内容添加到tbody中
					$( tbody ).append( trArray.join('') );
					// 把tbody添加到table中
					$( '#table_'+val ).append( tbody );
					// 把当前div的isLazy属性设置为0
					$( _div ).attr( 'isLazy' , '0' );
					$( '#systemFunction' ).html( $( _div ).html() );
				},
				error : function(response){
					aerouiAlert( response );
				}
			} );
		}
	}
}
  